package com.roc.demo.serializer;

import com.roc.demo.spi.SpiLoader;

import java.util.HashMap;
import java.util.Map;

/**
 * 序列化器工厂（用于获取序列化器对象）
 * 工厂模式 + 单例模式
 */
public class SerializerFactory {

    //使用静态代码块，在工厂首次加载时，就会调用Spiloader的load方法加载序列化器接口的所有实现类，之后就可以通过调用qetlnstance方法获取指定的实现类对象了。
    static {
        SpiLoader.load(Serializer.class);
    }

    /**
     * 序列化映射（用于实现单例）
     * 实现SPI机制后，通过getInstance方法获取配置加载序列化器，无需再静态添加
     */
//    private static final Map<String, Serializer> KEY_SERIALIZER_MAP = new HashMap<String, Serializer>() {{
//        put(SerializerKeys.JDK, new JdkSerializer());
//        put(SerializerKeys.JSON, new JsonSerializer());
//        put(SerializerKeys.KRYO, new KryoSerializer());
//        put(SerializerKeys.HESSIAN, new HessianSerializer());
//    }};

    /**
     * 默认序列化器
     */
    private static final Serializer DEFAULT_SERIALIZER = new JdkSerializer();

    /**
     * 获取实例
     *
     * @param key
     * @return
     */
    public static Serializer getInstance(String key) {
        //实现SPI机制后，通过SPI机制getInstance方法获取配置加载序列化器
//        return KEY_SERIALIZER_MAP.getOrDefault(key, DEFAULT_SERIALIZER);
        return SpiLoader.getInstance(Serializer.class, key);
    }

}

